package com.ruoyi.logistic.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageHelper;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.domain.vo.InitTableVo;
import com.ruoyi.common.domain.vo.TableVo;
import com.ruoyi.hqfinance.domain.HqBillCollect;
import com.ruoyi.hqfinance.domain.vo.HqBillCollectVo;
import com.ruoyi.hqfinance.mapper.HqBillCollectMapper;
import com.ruoyi.logistic.domain.HqNetworkBillDetailByName;
import com.ruoyi.logistic.domain.PageInfo;
import com.ruoyi.logistic.domain.dto.HqNetworkBillDetailByNameDto;
import com.ruoyi.logistic.domain.vo.DetailContrastVo;
import com.ruoyi.logistic.mapper.HqNetworkBigKindMapper;
import com.ruoyi.logistic.mapper.HqNetworkBillDetailByNameMapper;
import com.ruoyi.logistic.mapper.ScHqIncomeAndExpendCollectDetailMapper;
import com.ruoyi.logistic.service.HqNetworkBillDetailByNameService;
import com.ruoyi.statisticalCenter.domain.ScHqIncomeAndExpendCollect;
import com.ruoyi.statisticalCenter.domain.vo.ScHqIncomeAndExpendCollectVo;
import com.ruoyi.statisticalCenter.mapper.ScHqIncomeAndExpendCollectMapper;
import com.ruoyi.statisticalCenter.service.ScHqIncomeAndExpendCollectService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @Author cmz
 * @Date 2024-07-04 19:31
 */
@Service
public class HqNetworkBillDetailByNameServiceImpl implements HqNetworkBillDetailByNameService {
    @Resource
    private HqNetworkBillDetailByNameMapper hqNetworkBillDetailByNameMapper;
    @Resource
    private ScHqIncomeAndExpendCollectDetailMapper hqIncomeAndExpendCollectDetailMapper;
    @Resource
    private ScHqIncomeAndExpendCollectMapper scHqIncomeAndExpendCollectMapper;
    @Resource
    private HqNetworkBigKindMapper hqNetworkBigKindMapper;
    @Resource
    private HqBillCollectMapper hqBillCollectMapper;
    
    @Override
    public R detailContrast(DetailContrastVo vo) {
        if (vo.getQueryType()==1){
            ScHqIncomeAndExpendCollectVo incomeVo = new ScHqIncomeAndExpendCollectVo();
            if (vo.getQueryDate()!=null&&!vo.getQueryDate().equals("")){
                vo.setQueryDate(vo.getQueryDate().replace("-",""));
                incomeVo.setStartTime(vo.getQueryDate());
                incomeVo.setEndTime(vo.getQueryDate());
            }
            if (vo.getQueryMonth()!=null&&!vo.getQueryMonth().equals("")){
                vo.setQueryMonth(vo.getQueryMonth().replace("-",""));
                String dateStr = vo.getQueryMonth();
                int year = Integer.parseInt(dateStr.substring(0, 4));
                int month = Integer.parseInt(dateStr.substring(4)) - 1; // 月份从0开始，所以需要减1

                Calendar calendar = Calendar.getInstance();
                calendar.set(year, month, 1); // 设置为该月的第一天
                calendar.add(Calendar.MONTH, 1); // 加一个月
                calendar.add(Calendar.DAY_OF_MONTH, -1); // 减去一天，得到上个月的最后一天

                int lastDayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);

                incomeVo.setStartTime(dateStr+"01");
                incomeVo.setEndTime(dateStr+lastDayOfMonth);
            }

            PageHelper.startPage(vo.getPageDate());
            List<HqNetworkBillDetailByNameDto> collect = hqNetworkBillDetailByNameMapper.selectHqNetworkBillDetailByNameDto(vo);

            List<ScHqIncomeAndExpendCollect> collects = hqIncomeAndExpendCollectDetailMapper.selectScHqIncomeAndExpendCollect(incomeVo);
            if (collects==null || collects.size() ==0){
                collects = scHqIncomeAndExpendCollectMapper.collect(incomeVo);
            }

            for (HqNetworkBillDetailByNameDto hqNetworkBillDetailByNameDto : collect) {

                //ScHqIncomeAndExpendCollect scHqIncomeAndExpendCollect = collectMap.get(hqNetworkBillDetailByNameDto.getStoPreFeeName());
                for (ScHqIncomeAndExpendCollect sc : collects) {
                    if (hqNetworkBillDetailByNameDto.getAccountOrgName().equals(sc.getNetworkName())){
                        if (hqNetworkBillDetailByNameDto.getFeeBigName().equals(sc.getFeeBigKind())){
                            if (hqNetworkBillDetailByNameDto.getFeeSmallName().equals(sc.getFeeSmallKind())){
                                if (hqNetworkBillDetailByNameDto.getStoPreFeeName().equals(sc.getFeeName())){
                                    hqNetworkBillDetailByNameDto.setCxtPreFeeName(sc.getFeeName());
                                    hqNetworkBillDetailByNameDto.setCxtIncome(sc.getIncome());
                                    hqNetworkBillDetailByNameDto.setCxtExpense(sc.getExpend());
                                    hqNetworkBillDetailByNameDto.setCxtTotalSetlFee(sc.getTotalAmount());
                                    hqNetworkBillDetailByNameDto.setDifference(hqNetworkBillDetailByNameDto.getStoTotalSetlFee().subtract(hqNetworkBillDetailByNameDto.getCxtTotalSetlFee()));
                                }
                            }
                        }
                    }

                }

            }

            JSONObject jsonObject = new JSONObject();
            jsonObject.put("list", PageInfo.info(collect));
            jsonObject.put("fields", getTableVo());
            if (collect == null || collect.size() == 0) {
                return R.fail("暂无数据");
            } else {
                return R.ok(jsonObject);
            }
        }else {
            String startDateStr = "";
            String endDateStr = "";
            if (vo.getQueryDate()!=null&&!vo.getQueryDate().equals("")){
                startDateStr = vo.getQueryDate();
                endDateStr = vo.getQueryDate();
            }
            if (vo.getQueryMonth()!=null&&!vo.getQueryMonth().equals("")){
                startDateStr = vo.getQueryMonth()+"-01";
                endDateStr = getLastDayOfMonth(startDateStr);
            }
            PageHelper.startPage(vo.getPageDate());
            List<HqNetworkBillDetailByNameDto> collect =hqNetworkBigKindMapper.selectHqNetworkBillDetailByName(startDateStr,endDateStr);

            HqBillCollectVo hqBillCollectVo = new HqBillCollectVo();
            hqBillCollectVo.setStartTime(startDateStr.replace("-",""));
            hqBillCollectVo.setEndTime(endDateStr.replace("-",""));
            hqBillCollectVo.setDateType(0);
            hqBillCollectVo.setType(1);
            List<HqBillCollect> billCollectList = hqBillCollectMapper.collect(hqBillCollectVo);
            Map<String, HqBillCollect> collectMap = billCollectList.stream().collect(Collectors.toMap(a -> a.getCostBigKindId(), a -> a));
            for (HqNetworkBillDetailByNameDto dto : collect) {
                HqBillCollect hqBillCollect = collectMap.get(dto.getFeeBigName());
                dto.setCxtPreFeeName(hqBillCollect.getCostBigKindId());
                dto.setCxtIncome(BigDecimal.valueOf(hqBillCollect.getCollectIncome()));
                dto.setCxtExpense(BigDecimal.valueOf(hqBillCollect.getCollectExpend()));
                dto.setCxtTotalSetlFee(BigDecimal.valueOf(hqBillCollect.getCollectAmount()));
                dto.setDifference(dto.getStoTotalSetlFee().subtract(dto.getCxtTotalSetlFee()));
            }
            
            
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("list", PageInfo.info(collect));
            jsonObject.put("fields", getTableVo0());
            if (collect == null || collect.size() == 0) {
                return R.fail("暂无数据");
            } else {
                return R.ok(jsonObject);
            }
            
        }
        
    }


    public List<TableVo> getTableVo0() {
        List<TableVo> first = new ArrayList<>();
        TableVo firstTableVo = new TableVo();
        firstTableVo.setFields("bizDt");
        firstTableVo.setTranslate("统计日期");
        firstTableVo.setIsPoint(0);
        first.add(firstTableVo);
        firstTableVo = new TableVo();
        firstTableVo.setFields("accountOrgName");
        firstTableVo.setTranslate("结算网点名称");
        first.add(firstTableVo);
        firstTableVo = new TableVo();
        firstTableVo.setFields("feeBigName");
        firstTableVo.setTranslate("费用大类名称");
        first.add(firstTableVo);
        
        firstTableVo = new TableVo();
        firstTableVo.setFields("stoIncome");
        firstTableVo.setTranslate("申通网点-收入(元)");
        first.add(firstTableVo);
        firstTableVo = new TableVo();
        firstTableVo.setFields("stoExpense");
        firstTableVo.setTranslate("申通网点-支出(元)");
        first.add(firstTableVo);
        firstTableVo = new TableVo();
        firstTableVo.setFields("stoTotalSetlFee");
        firstTableVo.setTranslate("申通网点-合计金额");
        first.add(firstTableVo);
        firstTableVo = new TableVo();
        firstTableVo.setFields("cxtIncome");
        firstTableVo.setTranslate("赤小兔-收入");
        first.add(firstTableVo);
        firstTableVo = new TableVo();
        firstTableVo.setFields("cxtExpense");
        firstTableVo.setTranslate("赤小兔-支出");
        first.add(firstTableVo);
        firstTableVo = new TableVo();
        firstTableVo.setFields("cxtTotalSetlFee");
        firstTableVo.setTranslate("赤小兔-合计金额");
        first.add(firstTableVo);
        firstTableVo = new TableVo();
        firstTableVo.setFields("difference");
        firstTableVo.setTranslate("差额");
        first.add(firstTableVo);
        
        
        return first;
    }

    public List<TableVo> getTableVo() {
        List<TableVo> first = new ArrayList<>();
        TableVo firstTableVo = new TableVo();
        firstTableVo.setFields("bizDt");
        firstTableVo.setTranslate("统计日期");
        firstTableVo.setIsPoint(0);
        first.add(firstTableVo);
        firstTableVo = new TableVo();
        firstTableVo.setFields("accountOrgName");
        firstTableVo.setTranslate("结算网点名称");
        first.add(firstTableVo);
        firstTableVo = new TableVo();
        firstTableVo.setFields("feeBigName");
        firstTableVo.setTranslate("费用大类名称");
        first.add(firstTableVo);

        firstTableVo = new TableVo();
        firstTableVo.setFields("feeSmallName");
        firstTableVo.setTranslate("费用小类名称");
        first.add(firstTableVo);
        /*firstTableVo = new TableVo();
        firstTableVo.setFields("preFeeCode");
        firstTableVo.setTranslate("费用编码");
        first.add(firstTableVo);*/
        firstTableVo = new TableVo();
        firstTableVo.setFields("stoPreFeeName");
        firstTableVo.setTranslate("申通网点-费用名称");
        first.add(firstTableVo);
        firstTableVo = new TableVo();
        firstTableVo.setFields("stoIncome");
        firstTableVo.setTranslate("申通网点-收入(元)");
        first.add(firstTableVo);
        firstTableVo = new TableVo();
        firstTableVo.setFields("stoExpense");
        firstTableVo.setTranslate("申通网点-支出(元)");
        first.add(firstTableVo);
        firstTableVo = new TableVo();
        firstTableVo.setFields("stoTotalSetlFee");
        firstTableVo.setTranslate("申通网点-合计金额");
        first.add(firstTableVo);
        firstTableVo = new TableVo();
        firstTableVo.setFields("cxtPreFeeName");
        firstTableVo.setTranslate("赤小兔-费用名称");
        first.add(firstTableVo);
        firstTableVo = new TableVo();
        firstTableVo.setFields("cxtIncome");
        firstTableVo.setTranslate("赤小兔-收入");
        first.add(firstTableVo);
        firstTableVo = new TableVo();
        firstTableVo.setFields("cxtExpense");
        firstTableVo.setTranslate("赤小兔-支出");
        first.add(firstTableVo);
        firstTableVo = new TableVo();
        firstTableVo.setFields("cxtTotalSetlFee");
        firstTableVo.setTranslate("赤小兔-合计金额");
        first.add(firstTableVo);
        firstTableVo = new TableVo();
        firstTableVo.setFields("difference");
        firstTableVo.setTranslate("差额");
        first.add(firstTableVo);
        
        

        return first;
    }

    public static String getLastDayOfMonth(String dateStr) {
        // 解析输入的日期字符串
        LocalDate date = LocalDate.parse(dateStr);
        // 获取该月的最后一天
        YearMonth yearMonth = YearMonth.from(date);
        LocalDate lastDay = yearMonth.atEndOfMonth();
        // 将结果转换为字符串格式
        return lastDay.format(DateTimeFormatter.ISO_LOCAL_DATE);
    }
}
